import streamlit as st
import requests
import json
import time

# 设置页面配置
st.set_page_config(
    page_title="🎬 情感分析预测平台",
    layout="wide",
    initial_sidebar_state="expanded"
)

# 添加自定义CSS样式
st.markdown("""
<style>
    .main-header {
        font-size: 2.5rem;
        color: #1E88E5;
        text-align: center;
        margin-bottom: 2rem;
        font-weight: bold;
    }
    
    .sub-header {
        font-size: 1.5rem;
        color: #424242;
        margin-bottom: 1rem;
    }
    
    .result-card {
        background-color: #f8f9fa;
        border-radius: 10px;
        padding: 20px;
        margin: 10px 0;
        box-shadow: 0 2px 4px rgba(0,0,0,0.1);
    }
    
    .model-tag {
        background-color: #e3f2fd;
        color: #1976d2;
        padding: 5px 10px;
        border-radius: 15px;
        font-size: 0.9rem;
        font-weight: bold;
    }
    
    .time-tag {
        background-color: #fff3e0;
        color: #f57c00;
        padding: 5px 10px;
        border-radius: 15px;
        font-size: 0.9rem;
        font-weight: bold;
    }
    
    .stTextArea textarea {
        font-size: 1rem;
    }
    
    .stSelectbox div[data-baseweb="select"] {
        background-color: #f5f5f5;
    }
    
    .prediction-result {
        font-size: 1.2rem;
        padding: 15px;
        border-radius: 8px;
        margin: 10px 0;
    }
    
    .success-result {
        background-color: #e8f5e9;
        border-left: 5px solid #4caf50;
    }
    
    .error-result {
        background-color: #ffebee;
        border-left: 5px solid #f44336;
    }
</style>
""", unsafe_allow_html=True)

# 页面标题
st.markdown('<p class="main-header">🎬 商品评论情感分析平台</p>', unsafe_allow_html=True)
st.markdown("---")

# 侧边栏配置
with st.sidebar:
    st.header("⚙️ 配置选项")

    # 模型选择下拉框
    model_options = {
        "🤖 BERT 深度学习模型": "bert",
        "📊 传统机器学习模型": "base",
        "🧠 智谱AI大语言模型": "deepseek"
    }

    selected_model_name = st.selectbox(
        "选择预测模型",
        list(model_options.keys()),
        index=0,
        help="选择用于情感分析的模型"
    )

    selected_model_id = model_options[selected_model_name]

    # 模型说明
    model_descriptions = {
        "bert": "基于预训练 BERT 模型的深度学习分类器，提供高精度情感分析",
        "base": "传统机器学习模型，结合词向量和基础分类算法，处理速度快",
        "deepseek": "调用智谱AI大语言模型API，提供上下文感知的分析结果"
    }

    st.info(model_descriptions[selected_model_id])

    st.markdown("---")
    st.markdown("### 📊 模型特点")
    if selected_model_id == "bert":
        st.markdown("- 高精度情感分析\n- 深度学习技术\n- 上下文理解能力强")
    elif selected_model_id == "base":
        st.markdown("- 处理速度快\n- 资源消耗低\n- 传统机器学习算法")
    elif selected_model_id == "deepseek":
        st.markdown("- 上下文理解\n- 自然语言处理\n- API调用方式")

# 主要内容区域
st.markdown('<p class="sub-header">📝 输入商品评论</p>', unsafe_allow_html=True)

# 文本输入框
user_input = st.text_area(
    "",
    height=180,
    placeholder="例如：这个手机可太手机了。",
    help="输入您想要分析的商品评论"
)

# 预测按钮
col1, col2, col3 = st.columns([1,2,1])
with col2:
    predict_button = st.button("🚀 开始分析", type="primary", use_container_width=True)

# 结果显示区域
if predict_button:
    if not user_input:
        st.warning("请输入评论文本后再进行分析")
    else:
        # 开始计时
        start_time = time.time()

        with st.spinner("正在进行情感分析..."):
            try:
                # 准备请求数据
                payload = {
                    "modelId": selected_model_id,
                    "text": user_input
                }

                # 发送POST请求到Flask API
                response = requests.post(
                    "http://192.168.43.15:8080/predict",
                    json=payload,
                    headers={"Content-Type": "application/json"},
                    timeout=60
                )

                # 计算耗时
                end_time = time.time()
                elapsed_time = end_time - start_time

                if response.status_code == 200:
                    # 检查响应内容是否为空
                    if not response.text or response.text.strip() == "":
                        st.markdown('<div class="prediction-result error-result">', unsafe_allow_html=True)
                        st.error("API返回空响应，请检查API配置或稍后重试")
                        st.markdown('</div>', unsafe_allow_html=True)
                    else:
                        try:
                            # 尝试解析JSON
                            result = response.json()

                            # 显示结果卡片
                            st.markdown('<p class="sub-header">📊 分析结果</p>', unsafe_allow_html=True)

                            # 模型标签和耗时显示
                            col1, col2, col3 = st.columns([3,2,3])
                            with col1:
                                st.markdown(f'<span class="model-tag">使用模型: {selected_model_name}</span>', unsafe_allow_html=True)
                            with col2:
                                st.markdown(f'<span class="time-tag">耗时: {elapsed_time:.2f} 秒</span>', unsafe_allow_html=True)

                            st.markdown("---")

                            # 根据不同模型显示结果
                            with st.container():
                                st.markdown('<div class="result-card">', unsafe_allow_html=True)

                                if selected_model_id in ["bert", "base"]:
                                    # 结构化结果显示
                                    st.markdown('<div class="prediction-result success-result">', unsafe_allow_html=True)
                                    st.markdown("**预测结果:**")
                                    st.json(result)
                                    st.markdown('</div>', unsafe_allow_html=True)

                                elif selected_model_id == "deepseek":
                                    # 文本结果显示
                                    st.markdown('<div class="prediction-result success-result">', unsafe_allow_html=True)
                                    st.markdown("**预测结果:**")
                                    st.markdown(f"")
                                    st.markdown('</div>', unsafe_allow_html=True)

                                st.markdown('</div>', unsafe_allow_html=True)

                        except json.JSONDecodeError as e:
                            st.markdown('<div class="prediction-result error-result">', unsafe_allow_html=True)
                            st.error(f"API返回非JSON格式数据: {response.text[:200]}...")
                            st.markdown('</div>', unsafe_allow_html=True)

                else:
                    st.markdown('<div class="prediction-result error-result">', unsafe_allow_html=True)
                    st.error(f"API请求失败，状态码: {response.status_code}")
                    st.markdown('</div>', unsafe_allow_html=True)

            except requests.exceptions.ConnectionError:
                st.markdown('<div class="prediction-result error-result">', unsafe_allow_html=True)
                st.error("连接失败！请确保后端API服务正在运行(http://localhost:8080)")
                st.markdown('</div>', unsafe_allow_html=True)
            except requests.exceptions.Timeout:
                st.markdown('<div class="prediction-result error-result">', unsafe_allow_html=True)
                st.error("请求超时！请稍后重试")
                st.markdown('</div>', unsafe_allow_html=True)
            except Exception as e:
                st.markdown('<div class="prediction-result error-result">', unsafe_allow_html=True)
                st.error(f"发生错误: {str(e)}")
                st.markdown('</div>', unsafe_allow_html=True)

# 使用说明
with st.expander("ℹ️ 使用说明和帮助", expanded=False):
    st.markdown("""
    ### 🎯 如何使用本平台
    1. 在左侧选择您想要使用的模型
    2. 在文本框中输入商品评论内容
    3. 点击"开始分析"按钮获取预测结果
    4. 查看分析结果和处理耗时
    
    ### 🤖 模型介绍
    - **BERT模型**: 基于深度学习的预训练模型，提供高精度情感分析
    - **基础模型**: 使用传统机器学习算法，处理速度快
    - **大语言模型**: 调用智谱AI API，能理解复杂语境和隐含情感
    
    ### ⚠️ 注意事项
    - 请确保后端API服务已在本地8080端口启动
    - 大语言模型可能需要网络连接和API密钥
    - 不同模型的处理时间可能有所差异
    """)

    st.info("💡 提示：可以尝试输入不同类型的商品评论来比较不同模型的表现")
